package com.project.dao.imp;

import com.project.bean.StudentBean;

import java.lang.reflect.Field;
import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class BaseDao {
    /**
     * DAO的父类
     */

    /**
     * 连接
     */
    protected Connection con;
    /**
     * SQL语句执行对象
     */
    protected PreparedStatement ps;
    /**
     * 结果集
     */
    protected ResultSet re;

    /**
     * 建立链接
     */
    public void setConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:12345/test?characterEncoding=Utf-8",
                    "root", "lovo");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭流操作
     */
    public void closeConnection() {
        try {
            if (re != null) {
                re.close();
            }
            if (ps != null) {
                ps.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    /**
     * 跟新数据库数据
     *
     * @param sql        sql语句
     * @param valueArray 值列表
     */
    public void updateData(String sql, Object... valueArray) {
//        updateData("",new Object[{90,"333","333"}]);
        this.setConnection();
        try {
            ps = con.prepareCall(sql);
            for (int i = 0; i < valueArray.length; i++) {
                ps.setObject(i + 1, valueArray[i]);
            }

            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            this.closeConnection();
        }
    }

    public List findData(String sql, Class beanClass, Object... valueArray) {
        List list = new ArrayList<>();
        this.setConnection();

        try {
            ps = con.prepareStatement(sql);
            for (int i = 0; i < valueArray.length; i++) {
                ps.setObject(i + 1, valueArray[i]);
            }
            re = ps.executeQuery();

//            while (re.next()) {
//                //调用实体类的无参构造方法产生对象
//                Object beanObj = beanClass.getConstructor().newInstance();
//                //得到实体类中所有的属性列表
//                Field[] fields = beanClass.getDeclaredFields();
//                for (Field f : fields) {
//                    //从结果集中得到当前的属性值
//                    Object value = re.getObject(f.getName());
//                    if (f.getType() == LocalDate.class) {
//                        value = LocalDate.parse(value.toString());
//                    }
//                    //去掉修饰符检查
//                    f.setAccessible(true);
//                    //将beanObj对象的f属性，设置为value值
//                    f.set(beanObj, value);
//                }
//                list.add(beanObj);
//            }


//            得到结果集信息对象
            ResultSetMetaData rm = re.getMetaData();
//            得到查询列数
            int columnCount = rm.getColumnCount();
            while (re.next()) {
                Object beanObj = beanClass.getConstructor().newInstance();
                for (int i = 1; i <= columnCount; i++) {
//                    得到指定位置的列名
                    String columnName = rm.getColumnName(i);
                    Object value = re.getObject(columnName);
                    if (value instanceof java.sql.Date) {
                        value = LocalDate.parse(value.toString());
                    }
//                    根据属性名，得到属性对象
                    Field f = beanClass.getDeclaredField(columnName);
                    f.setAccessible(true);
//                    给对象中的指定属性赋值
                    f.set(beanObj, value);
                }
                list.add(beanObj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            this.closeConnection();
        }
        return list;
    }
}

